/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package riogol2;

/**
 *
 * @author treiman
 */
public class Board {
    
    private int[][] board;
    
    // filereader
    private FileHandler fileHandler;
    
    public Board(int rivimaara, int sarakemaara) {
        if(rivimaara > 0 && sarakemaara > 0) {
            board = new int[rivimaara][sarakemaara];
        }
    }
    
    public Board() {
        
    }
    
    public int[][] getTaulu() {
        return board;
    }
    
    public void setTaulu(int[][] taulu) {
        this.board = taulu;
    }
    
    // rivien lukumäärä
    public int getRivimaara() {
        return board.length;
    }
    
    // sarakkeiden lukumäärä
    public int getSarakemaara() {
        return board[0].length;
    }
    
    // onko solu elossa
    public boolean onElossa(int rivi, int sarake) {
        if((rivi > -1 && sarake > -1) && (rivi < board.length && sarake < board[0].length)) {
            return board[rivi][sarake] == 1;
        }
        else {
            return false;
        }
    }
    
    // herätä solu henkiin
    public void herata(int rivi, int sarake) {
        board[rivi][sarake] = 1;
    }
    
    // tapa solu
    public void tapa(int rivi, int sarake) {
        board[rivi][sarake] = 0;
    }
    
    // elävien naapurien lukumäärä
    public int elavatNaapurit(int rivi, int sarake) {
        
        int lukumaara = 0;

        if(onElossa(rivi-1, sarake-1)) {
            lukumaara++;
        }
        if(onElossa(rivi-1, sarake)) {
            lukumaara++;
        }
        if(onElossa(rivi-1, sarake+1)) {
            lukumaara++;
        }

        // tarkistetaan saman rivin naapurit
        if(onElossa(rivi, sarake-1)) {
            lukumaara++;
        }
        if(onElossa(rivi, sarake+1)) {
            lukumaara++;
        }

        // tarkistetaan alemman rivin naapurit
        if(onElossa(rivi+1, sarake-1)) {
            lukumaara++;
        }
        if(onElossa(rivi+1, sarake)) {
            lukumaara++;
        }
        if(onElossa(rivi+1, sarake+1)) {
            lukumaara++;
        }
        
        return lukumaara;
            
    }
    
    // tarkistaan pysyykö solu elossa seuraavaan sukupolveen siirryttäessä
    public boolean jatkaakoElossa(int rivi, int sarake) {

        // haetaan solun elävien naapureiden lukumäärä
        int lukumaara = elavatNaapurit(rivi, sarake);
        //System.out.println("Solun: [" + rivi + "," + sarake + "] elävien naapureiden lukumäärä: " + lukumaara);
        
        // onko solu tällä hetkellä elossa
        if(onElossa(rivi, sarake)) {
            //System.out.println("Solu [" + rivi + "," + sarake + "] on elossa");
            
            // tapetaan vastaava seuraavan sukupolven solu, jos eläviä naapureita alle 2 tai yli 3
            if(lukumaara < 2 || lukumaara > 3) {
                return false;
            }
            // muutoin vastaava seuraavan sukupolven solu pysyy elossa
            else {
                return true;
            }
        }
        // muutoin solu on kuollut tällä hetkellä
        else {
            // vastaava seuraavan sukupolven solu herätetään henkiin, jos 3 elävää naapuria
            if(lukumaara == 3) {
                return true;
            }
            // muutoin solu pysyy kuolleena
            else {
                return false;
            }
        }
    }

}    
